//object：为需要使用的对象。
//门栓本身要是volitle
void run(){
	do{
		int i = 0;
		//要求在可用状态 getObject() 是无锁的
		//解决方案：通过是否无效的标识(boolean) 快速地获取可用对象 一旦无效将会调用门栓的等待
		int checkCount = getCheckCount();
		Object result = f(getObject()); 
		//获取更新次数
		int updateCount = getUpdateCount();
		//解决方案：检测为无效 修改标识，先判断更新次数，同时尝试加锁，取不到直接跳过，创建门栓，更新次数++
		if(checkInvalid(result,checkCount)) {
			//要求只有一个线程进入刷新，其他线程直接跳过。
			//保证不重复刷新，即（一次失败，保证只运行一次refreshObject()方法。）
			//注意：当刷新完毕的时候（此时object是有效的），那么绝不允许有其他线程再进来。
			//解决方案：判断更新次数是否相等，相等之后就 获取锁（没有获取锁的直接忽略）刷新object，
			//			无论成功与否，修改标识，更新次数++，放开门栓并且设为null。（这里是需要保证执行的）
			refreshObject(updateCount); 
		} else {
			break;
		}
		i++;
		if(i > 10) {
			throw new RuntimeException("重试超时....");
		}
	} while (true);
}
//实现的一些特征
//门栓的创建以及销毁：只由一个线程来处理，并且顺序是不会颠倒的。同时门栓的等待也将会在创建后才被调用
//刷新对象的时候：一次失效后，只有一个线程进入，并且在第二次失效前，不会有第二个线程再进去。

//还可能存在的问题：当进行门栓创建的时候，有其他线程在等待，然而完成对象刷新之后门栓被置空，此时还有门栓创建的线程在等待。
//解决方案：给创建门栓也加入版本号。